package com.zxw.设计模式.结构型.代理模式.JDK代理.动态代理.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @projectName: util-cloud
 * @package: com.zxw.设计模式.结构型.代理模式.JDK代理.动态代理.proxy
 * @className: ProxyFactory
 * @author: zhangxuewei
 * @description: 代理工厂-动态生成代理对象
 * @date: 2023/6/16 14:26
 * @version: 1.0
 */
public class ProxyFactory {

    /**
     * 目标对象
     */
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * @param :
     * @return Object
     * @author zhangxuewei
     * @description 给目标对象生成代理对象
     * @date 2023/6/17 11:03
     */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),// 目标类使用的类加载器
                target.getClass().getInterfaces(),// 目标对象实现的接口类型
                // 目标类事件处理器
                new InvocationHandler() {
                    /**
                     * @param o: 代理对象
                     * @param method: 对应于在代理对象上调用的接口方法method实例
                     * @param args: 代理对象调用方法实际传递的参数
                     * @return Object 返回代理对象调用方法的返回值，如果没有则返回null
                     * @author zhangxuewei
                     * @description TODO
                     * @date 2023/6/17 11:07
                     */
                    @Override
                    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
                        System.out.println("开启事务");
                        if (method.getName().equals("update")) {
                            if (args.length > 0) {
                                args[0] = Integer.valueOf(args[0].toString()) + 1;
                            }
                        }
                        Object obj = method.invoke(target, args);
                        System.out.println("关闭事务");
                        return obj;
                    }
                }
        );
    }
}
